home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / LoadM3d.cpp < prev    next >
C/C++ Source or Header  |  2016-03-02  |  8KB  |  257 lines

  1. #include "LoadM3d.h"
  2.  
  3. using namespace DirectX;
  4.  
  5. bool M3DLoader::LoadM3d(const std::string& filename, 
  6.                         std::vector<Vertex>& vertices,
  7.                         std::vector<USHORT>& indices,
  8.                         std::vector<Subset>& subsets,
  9.                         std::vector<M3dMaterial>& mats)
  10. {
  11.     std::ifstream fin(filename);
  12.  
  13.     UINT numMaterials = 0;
  14.     UINT numVertices  = 0;
  15.     UINT numTriangles = 0;
  16.     UINT numBones     = 0;
  17.     UINT numAnimationClips = 0;
  18.  
  19.     std::string ignore;
  20.  
  21.     if( fin )
  22.     {
  23.         fin >> ignore; // file header text
  24.         fin >> ignore >> numMaterials;
  25.         fin >> ignore >> numVertices;
  26.         fin >> ignore >> numTriangles;
  27.         fin >> ignore >> numBones;
  28.         fin >> ignore >> numAnimationClips;
  29.  
  30.         ReadMaterials(fin, numMaterials, mats);
  31.         ReadSubsetTable(fin, numMaterials, subsets);
  32.         ReadVertices(fin, numVertices, vertices);
  33.         ReadTriangles(fin, numTriangles, indices);
  34.  
  35.         return true;
  36.      }
  37.     return false;
  38. }
  39.  
  40. bool M3DLoader::LoadM3d(const std::string& filename, 
  41.                         std::vector<SkinnedVertex>& vertices,
  42.                         std::vector<USHORT>& indices,
  43.                         std::vector<Subset>& subsets,
  44.                         std::vector<M3dMaterial>& mats,
  45.                         SkinnedData& skinInfo)
  46. {
  47.     std::ifstream fin(filename);
  48.  
  49.     UINT numMaterials = 0;
  50.     UINT numVertices  = 0;
  51.     UINT numTriangles = 0;
  52.     UINT numBones     = 0;
  53.     UINT numAnimationClips = 0;
  54.  
  55.     std::string ignore;
  56.  
  57.     if( fin )
  58.     {
  59.         fin >> ignore; // file header text
  60.         fin >> ignore >> numMaterials;
  61.         fin >> ignore >> numVertices;
  62.         fin >> ignore >> numTriangles;
  63.         fin >> ignore >> numBones;
  64.         fin >> ignore >> numAnimationClips;
  65.  
  66.         std::vector<XMFLOAT4X4> boneOffsets;
  67.         std::vector<int> boneIndexToParentIndex;
  68.         std::unordered_map<std::string, AnimationClip> animations;
  69.  
  70.         ReadMaterials(fin, numMaterials, mats);
  71.         ReadSubsetTable(fin, numMaterials, subsets);
  72.         ReadSkinnedVertices(fin, numVertices, vertices);
  73.         ReadTriangles(fin, numTriangles, indices);
  74.         ReadBoneOffsets(fin, numBones, boneOffsets);
  75.         ReadBoneHierarchy(fin, numBones, boneIndexToParentIndex);
  76.         ReadAnimationClips(fin, numBones, numAnimationClips, animations);
  77.  
  78.         skinInfo.Set(boneIndexToParentIndex, boneOffsets, animations);
  79.  
  80.         return true;
  81.     }
  82.     return false;
  83. }
  84.  
  85. void M3DLoader::ReadMaterials(std::ifstream& fin, UINT numMaterials, std::vector<M3dMaterial>& mats)
  86. {
  87.      std::string ignore;
  88.      mats.resize(numMaterials);
  89.  
  90.      std::string diffuseMapName;
  91.      std::string normalMapName;
  92.  
  93.      fin >> ignore; // materials header text
  94.      for(UINT i = 0; i < numMaterials; ++i)
  95.      {
  96.          fin >> ignore >> mats[i].Name;
  97.          fin >> ignore >> mats[i].DiffuseAlbedo.x  >> mats[i].DiffuseAlbedo.y  >> mats[i].DiffuseAlbedo.z;
  98.          fin >> ignore >> mats[i].FresnelR0.x >> mats[i].FresnelR0.y >> mats[i].FresnelR0.z;
  99.          fin >> ignore >> mats[i].Roughness;
  100.          fin >> ignore >> mats[i].AlphaClip;
  101.          fin >> ignore >> mats[i].MaterialTypeName;
  102.          fin >> ignore >> mats[i].DiffuseMapName;
  103.          fin >> ignore >> mats[i].NormalMapName;
  104.         }
  105. }
  106.  
  107. void M3DLoader::ReadSubsetTable(std::ifstream& fin, UINT numSubsets, std::vector<Subset>& subsets)
  108. {
  109.     std::string ignore;
  110.     subsets.resize(numSubsets);
  111.  
  112.     fin >> ignore; // subset header text
  113.     for(UINT i = 0; i < numSubsets; ++i)
  114.     {
  115.         fin >> ignore >> subsets[i].Id;
  116.         fin >> ignore >> subsets[i].VertexStart;
  117.         fin >> ignore >> subsets[i].VertexCount;
  118.         fin >> ignore >> subsets[i].FaceStart;
  119.         fin >> ignore >> subsets[i].FaceCount;
  120.     }
  121. }
  122.  
  123. void M3DLoader::ReadVertices(std::ifstream& fin, UINT numVertices, std::vector<Vertex>& vertices)
  124. {
  125.     std::string ignore;
  126.     vertices.resize(numVertices);
  127.  
  128.     fin >> ignore; // vertices header text
  129.     for(UINT i = 0; i < numVertices; ++i)
  130.     {
  131.         fin >> ignore >> vertices[i].Pos.x      >> vertices[i].Pos.y      >> vertices[i].Pos.z;
  132.         fin >> ignore >> vertices[i].TangentU.x >> vertices[i].TangentU.y >> vertices[i].TangentU.z >> vertices[i].TangentU.w;
  133.         fin >> ignore >> vertices[i].Normal.x   >> vertices[i].Normal.y   >> vertices[i].Normal.z;
  134.         fin >> ignore >> vertices[i].TexC.x     >> vertices[i].TexC.y;
  135.     }
  136. }
  137.  
  138. void M3DLoader::ReadSkinnedVertices(std::ifstream& fin, UINT numVertices, std::vector<SkinnedVertex>& vertices)
  139. {
  140.     std::string ignore;
  141.     vertices.resize(numVertices);
  142.  
  143.     fin >> ignore; // vertices header text
  144.     int boneIndices[4];
  145.     float weights[4];
  146.     for(UINT i = 0; i < numVertices; ++i)
  147.     {
  148.         float blah;
  149.         fin >> ignore >> vertices[i].Pos.x        >> vertices[i].Pos.y          >> vertices[i].Pos.z;
  150.         fin >> ignore >> vertices[i].TangentU.x   >> vertices[i].TangentU.y     >> vertices[i].TangentU.z >> blah /*vertices[i].TangentU.w*/;
  151.         fin >> ignore >> vertices[i].Normal.x     >> vertices[i].Normal.y       >> vertices[i].Normal.z;
  152.         fin >> ignore >> vertices[i].TexC.x       >> vertices[i].TexC.y;
  153.         fin >> ignore >> weights[0]     >> weights[1]     >> weights[2]     >> weights[3];
  154.         fin >> ignore >> boneIndices[0] >> boneIndices[1] >> boneIndices[2] >> boneIndices[3];
  155.  
  156.         vertices[i].BoneWeights.x = weights[0];
  157.         vertices[i].BoneWeights.y = weights[1];
  158.         vertices[i].BoneWeights.z = weights[2];
  159.  
  160.         vertices[i].BoneIndices[0] = (BYTE)boneIndices[0]; 
  161.         vertices[i].BoneIndices[1] = (BYTE)boneIndices[1]; 
  162.         vertices[i].BoneIndices[2] = (BYTE)boneIndices[2]; 
  163.         vertices[i].BoneIndices[3] = (BYTE)boneIndices[3]; 
  164.     }
  165. }
  166.  
  167. void M3DLoader::ReadTriangles(std::ifstream& fin, UINT numTriangles, std::vector<USHORT>& indices)
  168. {
  169.     std::string ignore;
  170.     indices.resize(numTriangles*3);
  171.  
  172.     fin >> ignore; // triangles header text
  173.     for(UINT i = 0; i < numTriangles; ++i)
  174.     {
  175.         fin >> indices[i*3+0] >> indices[i*3+1] >> indices[i*3+2];
  176.     }
  177. }
  178.  
  179. void M3DLoader::ReadBoneOffsets(std::ifstream& fin, UINT numBones, std::vector<XMFLOAT4X4>& boneOffsets)
  180. {
  181.     std::string ignore;
  182.     boneOffsets.resize(numBones);
  183.  
  184.     fin >> ignore; // BoneOffsets header text
  185.     for(UINT i = 0; i < numBones; ++i)
  186.     {
  187.         fin >> ignore >> 
  188.             boneOffsets[i](0,0) >> boneOffsets[i](0,1) >> boneOffsets[i](0,2) >> boneOffsets[i](0,3) >>
  189.             boneOffsets[i](1,0) >> boneOffsets[i](1,1) >> boneOffsets[i](1,2) >> boneOffsets[i](1,3) >>
  190.             boneOffsets[i](2,0) >> boneOffsets[i](2,1) >> boneOffsets[i](2,2) >> boneOffsets[i](2,3) >>
  191.             boneOffsets[i](3,0) >> boneOffsets[i](3,1) >> boneOffsets[i](3,2) >> boneOffsets[i](3,3);
  192.     }
  193. }
  194.  
  195. void M3DLoader::ReadBoneHierarchy(std::ifstream& fin, UINT numBones, std::vector<int>& boneIndexToParentIndex)
  196. {
  197.     std::string ignore;
  198.     boneIndexToParentIndex.resize(numBones);
  199.  
  200.     fin >> ignore; // BoneHierarchy header text
  201.     for(UINT i = 0; i < numBones; ++i)
  202.     {
  203.         fin >> ignore >> boneIndexToParentIndex[i];
  204.     }
  205. }
  206.  
  207. void M3DLoader::ReadAnimationClips(std::ifstream& fin, UINT numBones, UINT numAnimationClips, 
  208.                                    std::unordered_map<std::string, AnimationClip>& animations)
  209. {
  210.     std::string ignore;
  211.     fin >> ignore; // AnimationClips header text
  212.     for(UINT clipIndex = 0; clipIndex < numAnimationClips; ++clipIndex)
  213.     {
  214.         std::string clipName;
  215.         fin >> ignore >> clipName;
  216.         fin >> ignore; // {
  217.  
  218.         AnimationClip clip;
  219.         clip.BoneAnimations.resize(numBones);
  220.  
  221.         for(UINT boneIndex = 0; boneIndex < numBones; ++boneIndex)
  222.         {
  223.             ReadBoneKeyframes(fin, numBones, clip.BoneAnimations[boneIndex]);
  224.         }
  225.         fin >> ignore; // }
  226.  
  227.         animations[clipName] = clip;
  228.     }
  229. }
  230.  
  231. void M3DLoader::ReadBoneKeyframes(std::ifstream& fin, UINT numBones, BoneAnimation& boneAnimation)
  232. {
  233.     std::string ignore;
  234.     UINT numKeyframes = 0;
  235.     fin >> ignore >> ignore >> numKeyframes;
  236.     fin >> ignore; // {
  237.  
  238.     boneAnimation.Keyframes.resize(numKeyframes);
  239.     for(UINT i = 0; i < numKeyframes; ++i)
  240.     {
  241.         float t    = 0.0f;
  242.         XMFLOAT3 p(0.0f, 0.0f, 0.0f);
  243.         XMFLOAT3 s(1.0f, 1.0f, 1.0f);
  244.         XMFLOAT4 q(0.0f, 0.0f, 0.0f, 1.0f);
  245.         fin >> ignore >> t;
  246.         fin >> ignore >> p.x >> p.y >> p.z;
  247.         fin >> ignore >> s.x >> s.y >> s.z;
  248.         fin >> ignore >> q.x >> q.y >> q.z >> q.w;
  249.  
  250.         boneAnimation.Keyframes[i].TimePos      = t;
  251.         boneAnimation.Keyframes[i].Translation  = p;
  252.         boneAnimation.Keyframes[i].Scale        = s;
  253.         boneAnimation.Keyframes[i].RotationQuat = q;
  254.     }
  255.  
  256.     fin >> ignore; // }
  257. }